# -*- coding: utf-8 -*-
import re
import datetime
from django import forms
from lr.settings import CONTEST_CASH_LIMIT
from lr.work.models import Genre


class ContestForm(forms.Form):
    """ Форма ввода данных для создания конкурса """
    time_re = ur'^\d{1,2}[\.,]\d{1,2}[\.,](\d{2}|\d{4})( \d{1,2}\:\d{1,2})?$'
    
    title = forms.CharField(max_length=127, widget=forms.TextInput, label=u'Заголовок')
    genre = forms.ModelChoiceField(queryset=Genre.objects.all(), empty_label=u'Не определен', required=False, label=u'Жанр')
    theme = forms.CharField(widget=forms.Textarea(attrs={'cols': '40', 'rows': '4'}), label=u'Тема')
    competitors_limit = forms.IntegerField(max_value=25, min_value=0, initial=0, label=u'Максимальное количество участников')
    start_time = forms.RegexField(regex=time_re, max_length=16, widget=forms.TextInput, required=False, label=u'Время начала')
    time_limit = forms.RegexField(regex=time_re, max_length=16, widget=forms.TextInput, label=u'Время окончания')
    cash = forms.FloatField(initial=CONTEST_CASH_LIMIT, min_value=CONTEST_CASH_LIMIT, label=u'Награда')
    for_exclusive = forms.BooleanField(initial=False, required=False, label=u'Эксклюзивные права на произведение')
    
    
    def clean_start_time(self):
        """ Проверка корректности времени начала конкурса """
        return self._check_time(self.cleaned_data['start_time'])
    
    
    def clean_time_limit(self):
        """ Проверка корректности времени начала конкурса """
        return self._check_time(self.cleaned_data['time_limit'])
    
    
    def clean(self):
        """ Проверка правильности введенной даты """
        if 'competitors_limit' in self.cleaned_data and 'start_time' in self.cleaned_data \
        and not self.cleaned_data['competitors_limit'] and not self.cleaned_data['start_time']:
            raise forms.ValidationError(u'Одно из полей "Максимальное количество участников" или "Время начала конкурса" должно быть заполнено.')
        
        if 'start_time' in self.cleaned_data and self.cleaned_data['start_time']:
            start_time = datetime.datetime.strptime(self.cleaned_data['start_time'], '%d.%m.%Y %H:%M')
        else:
            start_time = None
        
        if 'time_limit' in self.cleaned_data and self.cleaned_data['time_limit']:
            time_limit = datetime.datetime.strptime(self.cleaned_data['time_limit'], '%d.%m.%Y %H:%M')
        else:
            time_limit = None
        
        if start_time:
            if (start_time - datetime.datetime.now()).days < 1:
                raise forms.ValidationError(u'Вы дали слишком мало времени до начала конкурса, конкурс может начаться не ранее чем через сутки.')
        
        if time_limit:
            if start_time:
                if (time_limit - start_time).days < 3:
                    raise forms.ValidationError(u'Вы отвели слишком мало времени на конкурс. Конкурс должен длиться не менее трех суток.')
            else:
                if (time_limit - datetime.datetime.now()).days < 3:
                    raise forms.ValidationError(u'Вы отвели слишком мало времени на конкурс. Конкурс должен длиться не менее трех суток.')
        
        return self.cleaned_data
    
    
    def _check_time(self, data_string):
        """ Вспомогательная функция проверки корректности введенной даты """
        if data_string:
            d = re.search(ur'^(?P<day>\d{1,2})[\.,](?P<month>\d{1,2})[\.,](?P<year>(\d{2}|\d{4}))( (?P<hours>\d{1,2})\:(?P<minutes>\d{1,2}))?$', data_string)
            if d:
                day = int(d.group('day'))
                month = int(d.group('month'))
                year = int(d.group('year'))
                hours = int(d.group('hours') or '0')
                minutes = int(d.group('minutes') or '0')
                if year < 100:
                    year += 2000
                
                try:
                    date = datetime.datetime(year, month, day, hours, minutes)
                except ValueError:
                    raise forms.ValidationError(u'Введена несуществующая дата.')
                return date.strftime('%d.%m.%Y %H:%M')
        return ''
